package com.seedog.mq.distributed;

import com.seedog.mq.model.Message;

import java.util.List;

/**
 * 分布式消息复制器接口，用于在分布式环境中复制消息
 */
public interface MessageReplicator {
    /**
     * 初始化消息复制器
     * @param config 分布式配置
     * @param clusterManager 集群管理器
     */
    void initialize(DistributedConfig config, ClusterManager clusterManager);
    
    /**
     * 复制消息到其他节点
     * @param message 要复制的消息
     * @return 是否复制成功
     */
    boolean replicateMessage(Message message);
    
    /**
     * 批量复制消息到其他节点
     * @param messages 要复制的消息列表
     * @return 复制成功的消息数量
     */
    int replicateMessages(List<Message> messages);
    
    /**
     * 同步消息到指定节点
     * @param nodeId 节点ID
     * @param messages 要同步的消息列表
     * @return 是否同步成功
     */
    boolean syncMessages(String nodeId, List<Message> messages);
    
    /**
     * 从其他节点同步消息
     * @param nodeId 节点ID
     * @return 同步的消息列表
     */
    List<Message> fetchMessagesFromNode(String nodeId);
    
    /**
     * 设置消息确认回调
     * @param callback 消息确认回调
     */
    void setMessageAckCallback(MessageAckCallback callback);
    
    /**
     * 启动消息复制器
     */
    void start();
    
    /**
     * 停止消息复制器
     */
    void stop();
    
    /**
     * 消息确认回调接口
     */
    interface MessageAckCallback {
        /**
         * 当消息被复制到足够数量的节点时调用
         * @param messageId 消息ID
         * @param replicasCount 复制数量
         */
        void onMessageReplicated(String messageId, int replicasCount);
        
        /**
         * 当消息复制失败时调用
         * @param messageId 消息ID
         * @param reason 失败原因
         */
        void onMessageReplicationFailed(String messageId, String reason);
    }
}